Code coverage report for src/observer-locator.js

Statements: 86.57% (116 / 134)      Branches: 80.28% (57 / 71)      Functions: 83.87% (26 / 31)      Lines: 86.92% (113 / 130)      Ignored: none     

All files » src/ » observer-locator.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 2441     1   18   1 57   57 57               57     1   2   1   1   1   1   1 1   5 5 5   1 1 1 1 1 1   1   1412   1 1   1       1 1 93 93 93 21 21   93     1 1 18   18 18 18 18     1       1 4256     4256 35     4221   4221 4168 190     4168     4221     1 198     1 189   189 189               189     1 11 11 6 6   9     1 4221   4221 4133 53   4080 55   4025 4025 6   4019 11   4008 14   3994 3994 147   3847 3842       93   93 1     92 92 13 2       11 11 9     79 79 79                                       1 9       9     1               1     1   1 1       1       1       1     1        
System.register(['aurelia-task-queue', './environment', './array-observation', './map-observation', './event-manager', './dirty-checking', './property-observation', './element-observation', './class-observer', 'aurelia-dependency-injection', './computed-observation', './svg'], function (_export) {
  'use strict';
 
  var TaskQueue, hasObjectObserve, _getArrayObserver, _getMapObserver, EventManager, DirtyChecker, DirtyCheckProperty, SetterObserver, OoObjectObserver, OoPropertyObserver, SelectValueObserver, CheckedObserver, ValueAttributeObserver, XLinkAttributeObserver, DataAttributeObserver, StyleObserver, ClassObserver, All, hasDeclaredDependencies, ComputedPropertyObserver, isStandardSvgAttribute, ObserverLocator, ObjectObservationAdapter;
 
  function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  function createObserverLookup(obj, observerLocator) {
    var value = new OoObjectObserver(obj, observerLocator);
 
    try {
      Object.defineProperty(obj, '__observer__', {
        enumerable: false,
        configurable: false,
        writable: false,
        value: value
      });
    } catch (_) {}
 
    return value;
  }
 
  return {
    setters: [function (_aureliaTaskQueue) {
      TaskQueue = _aureliaTaskQueue.TaskQueue;
    }, function (_environment) {
      hasObjectObserve = _environment.hasObjectObserve;
    }, function (_arrayObservation) {
      _getArrayObserver = _arrayObservation.getArrayObserver;
    }, function (_mapObservation) {
      _getMapObserver = _mapObservation.getMapObserver;
    }, function (_eventManager) {
      EventManager = _eventManager.EventManager;
    }, function (_dirtyChecking) {
      DirtyChecker = _dirtyChecking.DirtyChecker;
      DirtyCheckProperty = _dirtyChecking.DirtyCheckProperty;
    }, function (_propertyObservation) {
      SetterObserver = _propertyObservation.SetterObserver;
      OoObjectObserver = _propertyObservation.OoObjectObserver;
      OoPropertyObserver = _propertyObservation.OoPropertyObserver;
    }, function (_elementObservation) {
      SelectValueObserver = _elementObservation.SelectValueObserver;
      CheckedObserver = _elementObservation.CheckedObserver;
      ValueAttributeObserver = _elementObservation.ValueAttributeObserver;
      XLinkAttributeObserver = _elementObservation.XLinkAttributeObserver;
      DataAttributeObserver = _elementObservation.DataAttributeObserver;
      StyleObserver = _elementObservation.StyleObserver;
    }, function (_classObserver) {
      ClassObserver = _classObserver.ClassObserver;
    }, function (_aureliaDependencyInjection) {
      All = _aureliaDependencyInjection.All;
    }, function (_computedObservation) {
      hasDeclaredDependencies = _computedObservation.hasDeclaredDependencies;
      ComputedPropertyObserver = _computedObservation.ComputedPropertyObserver;
    }, function (_svg) {
      isStandardSvgAttribute = _svg.isStandardSvgAttribute;
    }],
    execute: function () {
 
      Eif (typeof Object.getPropertyDescriptor !== 'function') {
        Object.getPropertyDescriptor = function (subject, name) {
          var pd = Object.getOwnPropertyDescriptor(subject, name);
          var proto = Object.getPrototypeOf(subject);
          while (typeof pd === 'undefined' && proto !== null) {
            pd = Object.getOwnPropertyDescriptor(proto, name);
            proto = Object.getPrototypeOf(proto);
          }
          return pd;
        };
      }
      ObserverLocator = (function () {
        function ObserverLocator(taskQueue, eventManager, dirtyChecker, observationAdapters) {
          _classCallCheck(this, ObserverLocator);
 
          this.taskQueue = taskQueue;
          this.eventManager = eventManager;
          this.dirtyChecker = dirtyChecker;
          this.observationAdapters = observationAdapters;
        }
 
        ObserverLocator.inject = function inject() {
          return [TaskQueue, EventManager, DirtyChecker, All.of(ObjectObservationAdapter)];
        };
 
        ObserverLocator.prototype.getObserver = function getObserver(obj, propertyName) {
          var observersLookup = obj.__observers__,
              observer;
 
          if (observersLookup && propertyName in observersLookup) {
            return observersLookup[propertyName];
          }
 
          observer = this.createPropertyObserver(obj, propertyName);
 
          if (!observer.doNotCache) {
            if (observersLookup === undefined) {
              observersLookup = this.getOrCreateObserversLookup(obj);
            }
 
            observersLookup[propertyName] = observer;
          }
 
          return observer;
        };
 
        ObserverLocator.prototype.getOrCreateObserversLookup = function getOrCreateObserversLookup(obj) {
          return obj.__observers__ || this.createObserversLookup(obj);
        };
 
        ObserverLocator.prototype.createObserversLookup = function createObserversLookup(obj) {
          var value = {};
 
          try {
            Object.defineProperty(obj, '__observers__', {
              enumerable: false,
              configurable: false,
              writable: false,
              value: value
            });
          } catch (_) {}
 
          return value;
        };
 
        ObserverLocator.prototype.getObservationAdapter = function getObservationAdapter(obj, propertyName, descriptor) {
          var i, ii, observationAdapter;
          for (i = 0, ii = this.observationAdapters.length; i < ii; i++) {
            observationAdapter = this.observationAdapters[i];
            if (observationAdapter.handlesProperty(obj, propertyName, descriptor)) return observationAdapter;
          }
          return null;
        };
 
        ObserverLocator.prototype.createPropertyObserver = function createPropertyObserver(obj, propertyName) {
          var observerLookup, descriptor, handler, observationAdapter, xlinkResult;
 
          if (obj instanceof Element) {
            if (propertyName === 'class') {
              return new ClassObserver(obj);
            }
            if (propertyName === 'style' || propertyName === 'css') {
              return new StyleObserver(obj, propertyName);
            }
            handler = this.eventManager.getElementHandler(obj, propertyName);
            if (propertyName === 'value' && obj.tagName.toLowerCase() === 'select') {
              return new SelectValueObserver(obj, handler, this);
            }
            if (propertyName === 'checked' && obj.tagName.toLowerCase() === 'input') {
              return new CheckedObserver(obj, handler, this);
            }
            if (handler) {
              return new ValueAttributeObserver(obj, propertyName, handler);
            }
            xlinkResult = /^xlink:(.+)$/.exec(propertyName);
            if (xlinkResult) {
              return new XLinkAttributeObserver(obj, propertyName, xlinkResult[1]);
            }
            if (/^\w+:|^data-|^aria-/.test(propertyName) || obj instanceof SVGElement && isStandardSvgAttribute(obj.nodeName, propertyName)) {
              return new DataAttributeObserver(obj, propertyName);
            }
          }
 
          descriptor = Object.getPropertyDescriptor(obj, propertyName);
 
          if (hasDeclaredDependencies(descriptor)) {
            return new ComputedPropertyObserver(obj, propertyName, descriptor, this);
          }
 
          var existingGetterOrSetter = undefined;
          if (descriptor && (existingGetterOrSetter = descriptor.get || descriptor.set)) {
            if (existingGetterOrSetter.getObserver) {
              return existingGetterOrSetter.getObserver(obj);
            }
 
            // attempt to use an adapter before resorting to dirty checking.
            observationAdapter = this.getObservationAdapter(obj, propertyName, descriptor);
            if (observationAdapter) return observationAdapter.getObserver(obj, propertyName, descriptor);
            return new DirtyCheckProperty(this.dirtyChecker, obj, propertyName);
          }
 
          Eif (hasObjectObserve) {
            observerLookup = obj.__observer__ || createObserverLookup(obj, this);
            return observerLookup.getObserver(propertyName, descriptor);
          }
 
          if (obj instanceof Array) {
            if (propertyName === 'length') {
              return this.getArrayObserver(obj).getLengthObserver();
            } else {
              return new DirtyCheckProperty(this.dirtyChecker, obj, propertyName);
            }
          } else if (obj instanceof Map) {
            if (propertyName === 'size') {
              return this.getMapObserver(obj).getLengthObserver();
            } else {
              return new DirtyCheckProperty(this.dirtyChecker, obj, propertyName);
            }
          }
 
          return new SetterObserver(this.taskQueue, obj, propertyName);
        };
 
        ObserverLocator.prototype.getArrayObserver = function getArrayObserver(array) {
          Iif ('__array_observer__' in array) {
            return array.__array_observer__;
          }
 
          return array.__array_observer__ = _getArrayObserver(this.taskQueue, array);
        };
 
        ObserverLocator.prototype.getMapObserver = function getMapObserver(map) {
          if ('__map_observer__' in map) {
            return map.__map_observer__;
          }
 
          return map.__map_observer__ = _getMapObserver(this.taskQueue, map);
        };
 
        return ObserverLocator;
      })();
 
      _export('ObserverLocator', ObserverLocator);
 
      ObjectObservationAdapter = (function () {
        function ObjectObservationAdapter() {
          _classCallCheck(this, ObjectObservationAdapter);
        }
 
        ObjectObservationAdapter.prototype.handlesProperty = function handlesProperty(object, propertyName, descriptor) {
          throw new Error('BindingAdapters must implement handlesProperty(object, propertyName).');
        };
 
        ObjectObservationAdapter.prototype.getObserver = function getObserver(object, propertyName, descriptor) {
          throw new Error('BindingAdapters must implement createObserver(object, propertyName).');
        };
 
        return ObjectObservationAdapter;
      })();
 
      _export('ObjectObservationAdapter', ObjectObservationAdapter);
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL2JpbmRpbmcvc3JjL29ic2VydmVyLWxvY2F0b3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O3dZQXNEYSxlQUFlLEVBbUpmLHdCQUF3Qjs7OztBQWxLckMsV0FBUyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsZUFBZSxFQUFFO0FBQ2xELFFBQUksS0FBSyxHQUFHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDOztBQUV2RCxRQUFHO0FBQ0QsWUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsY0FBYyxFQUFFO0FBQ3pDLGtCQUFVLEVBQUUsS0FBSztBQUNqQixvQkFBWSxFQUFFLEtBQUs7QUFDbkIsZ0JBQVEsRUFBRSxLQUFLO0FBQ2YsYUFBSyxFQUFFLEtBQUs7T0FDYixDQUFDLENBQUM7S0FDSixDQUFBLE9BQU0sQ0FBQyxFQUFDLEVBQUU7O0FBRVgsV0FBTyxLQUFLLENBQUM7R0FDZDs7OztvQ0FwRE8sU0FBUzs7c0NBQ1QsZ0JBQWdCOzs0Q0FDaEIsZ0JBQWdCOzt3Q0FDaEIsY0FBYzs7bUNBQ2QsWUFBWTs7b0NBQ1osWUFBWTswQ0FBRSxrQkFBa0I7OzRDQUV0QyxjQUFjOzhDQUNkLGdCQUFnQjtnREFDaEIsa0JBQWtCOztnREFHbEIsbUJBQW1COzRDQUNuQixlQUFlO21EQUNmLHNCQUFzQjttREFDdEIsc0JBQXNCO2tEQUN0QixxQkFBcUI7MENBQ3JCLGFBQWE7O3FDQUVQLGFBQWE7O3dDQUNiLEdBQUc7O3FEQUVULHVCQUF1QjtzREFDdkIsd0JBQXdCOztvQ0FFbEIsc0JBQXNCOzs7O0FBRTlCLFVBQUcsT0FBTyxNQUFNLENBQUMscUJBQXFCLEtBQUssVUFBVSxFQUFDO0FBQ3JELGNBQU0sQ0FBQyxxQkFBcUIsR0FBRyxVQUFVLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDckQsY0FBSSxF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TyxLQUFLLENBQUMsa0JBQWtCLENBQUM7V0FDakM7O0FBRUQsaUJBQU8sS0FBSyxDQUFDLGtCQUFrQixHQUFHLGlCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0U7O0FBeElVLHVCQUFlLFdBMEkxQixjQUFjLEdBQUEsd0JBQUMsR0FBRyxFQUFDO0FBQ2pCLGNBQUcsa0JBQWtCLElBQUksR0FBRyxFQUFDO0FBQzNCLG1CQUFPLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztXQUM3Qjs7QUFFRCxpQkFBTyxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsZUFBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDbkU7O2VBaEpVLGVBQWU7OztpQ0FBZixlQUFlOztBQW1KZiw4QkFBd0I7aUJBQXhCLHdCQUF3QjtnQ0FBeEIsd0JBQXdCOzs7QUFBeEIsZ0NBQXdCLFdBQ25DLGVBQWUsR0FBQSx5QkFBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRTtBQUNoRCxnQkFBTSxJQUFJLEtBQUssQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDO1NBQzFGOztBQUhVLGdDQUF3QixXQUtuQyxXQUFXLEdBQUEscUJBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUU7QUFDNUMsZ0JBQU0sSUFBSSxLQUFLLENBQUMsc0VBQXNFLENBQUMsQ0FBQztTQUN6Rjs7ZUFQVSx3QkFBd0I7OzswQ0FBeEIsd0JBQXdCIiwiZmlsZSI6Ii9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL2JpbmRpbmcvc3JjL29ic2VydmVyLWxvY2F0b3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1Rhc2tRdWV1ZX0gZnJvbSAnYXVyZWxpYS10YXNrLXF1ZXVlJztcbmltcG9ydCB7aGFzT2JqZWN0T2JzZXJ2ZX0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQge2dldEFycmF5T2JzZXJ2ZXJ9IGZyb20gJy4vYXJyYXktb2JzZXJ2YXRpb24nO1xuaW1wb3J0IHtnZXRNYXBPYnNlcnZlcn0gZnJvbSAnLi9tYXAtb2JzZXJ2YXRpb24nO1xuaW1wb3J0IHtFdmVudE1hbmFnZXJ9IGZyb20gJy4vZXZlbnQtbWFuYWdlcic7XG5pbXBvcnQge0RpcnR5Q2hlY2tlciwgRGlydHlDaGVja1Byb3BlcnR5fSBmcm9tICcuL2RpcnR5LWNoZWNraW5nJztcbmltcG9ydCB7XG4gIFNldHRlck9ic2VydmVyLFxuICBPb09iamVjdE9ic2VydmVyLFxuICBPb1Byb3BlcnR5T2JzZXJ2ZXJcbn0gZnJvbSAnLi9wcm9wZXJ0eS1vYnNlcnZhdGlvbic7XG5pbXBvcnQge1xuICBTZWxlY3RWYWx1ZU9ic2VydmVyLFxuICBDaGVja2VkT2JzZXJ2ZXIsXG4gIFZhbHVlQXR0cmlidXRlT2JzZXJ2ZXIsXG4gIFhMaW5rQXR0cmlidXRlT2JzZXJ2ZXIsXG4gIERhdGFBdHRyaWJ1dGVPYnNlcnZlcixcbiAgU3R5bGVPYnNlcnZlclxufSBmcm9tICcuL2VsZW1lbnQtb2JzZXJ2YXRpb24nO1xuaW1wb3J0IHtDbGFzc09ic2VydmVyfSBmcm9tICcuL2NsYXNzLW9ic2VydmVyJztcbmltcG9ydCB7QWxsfSBmcm9tICdhdXJlbGlhLWRlcGVuZGVuY3ktaW5qZWN0aW9uJztcbmltcG9ydCB7XG4gIGhhc0RlY2xhcmVkRGVwZW5kZW5jaWVzLFxuICBDb21wdXRlZFByb3BlcnR5T2JzZXJ2ZXJcbn0gZnJvbSAnLi9jb21wdXRlZC1vYnNlcnZhdGlvbic7XG5pbXBvcnQge2lzU3RhbmRhcmRTdmdBdHRyaWJ1dGV9IGZyb20gJy4vc3ZnJztcblxuaWYodHlwZW9mIE9iamVjdC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IgIT09ICdmdW5jdGlvbicpe1xuIE9iamVjdC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiAoc3ViamVjdCwgbmFtZSkge1xuICAgIHZhciBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3ViamVjdCwgbmFtZSk7XG4gICAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHN1YmplY3QpO1xuICAgIHdoaWxlICh0eXBlb2YgcGQgPT09ICd1bmRlZmluZWQnICYmIHByb3RvICE9PSBudWxsKSB7XG4gICAgICBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG5hbWUpO1xuICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIH1cbiAgICByZXR1cm4gcGQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU9ic2VydmVyTG9va3VwKG9iaiwgb2JzZXJ2ZXJMb2NhdG9yKSB7XG4gIHZhciB2YWx1ZSA9IG5ldyBPb09iamVjdE9ic2VydmVyKG9iaiwgb2JzZXJ2ZXJMb2NhdG9yKTtcblxuICB0cnl7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgXCJfX29ic2VydmVyX19cIiwge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSk7XG4gIH1jYXRjaChfKXt9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJMb2NhdG9yIHtcbiAgc3RhdGljIGluamVjdCgpeyByZXR1cm4gW1Rhc2tRdWV1ZSwgRXZlbnRNYW5hZ2VyLCBEaXJ0eUNoZWNrZXIsIEFsbC5vZihPYmplY3RPYnNlcnZhdGlvbkFkYXB0ZXIpXTsgfVxuICBjb25zdHJ1Y3Rvcih0YXNrUXVldWUsIGV2ZW50TWFuYWdlciwgZGlydHlDaGVja2VyLCBvYnNlcnZhdGlvbkFkYXB0ZXJzKXtcbiAgICB0aGlzLnRhc2tRdWV1ZSA9IHRhc2tRdWV1ZTtcbiAgICB0aGlzLmV2ZW50TWFuYWdlciA9IGV2ZW50TWFuYWdlcjtcbiAgICB0aGlzLmRpcnR5Q2hlY2tlciA9IGRpcnR5Q2hlY2tlcjtcbiAgICB0aGlzLm9ic2VydmF0aW9uQWRhcHRlcnMgPSBvYnNlcnZhdGlvbkFkYXB0ZXJzO1xuICB9XG5cbiAgZ2V0T2JzZXJ2ZXIob2JqLCBwcm9wZXJ0eU5hbWUpe1xuICAgIHZhciBvYnNlcnZlcnNMb29rdXAgPSBvYmouX19vYnNlcnZlcnNfXyxcbiAgICAgICAgb2JzZXJ2ZXI7XG5cbiAgICBpZihvYnNlcnZlcnNMb29rdXAgJiYgcHJvcGVydHlOYW1lIGluIG9ic2VydmVyc0xvb2t1cCl7XG4gICAgICByZXR1cm4gb2JzZXJ2ZXJzTG9va3VwW3Byb3BlcnR5TmFtZV07XG4gICAgfVxuXG4gICAgb2JzZXJ2ZXIgPSB0aGlzLmNyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIob2JqLCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgaWYgKCFvYnNlcnZlci5kb05vdENhY2hlKXtcbiAgICAgIGlmKG9ic2VydmVyc0xvb2t1cCA9PT0gdW5kZWZpbmVkKXtcbiAgICAgICAgb2JzZXJ2ZXJzTG9va3VwID0gdGhpcy5nZXRPckNyZWF0ZU9ic2VydmVyc0xvb2t1cChvYmopO1xuICAgICAgfVxuXG4gICAgICBvYnNlcnZlcnNMb29rdXBbcHJvcGVydHlOYW1lXSA9IG9ic2VydmVyO1xuICAgIH1cblxuICAgIHJldHVybiBvYnNlcnZlcjtcbiAgfVxuXG4gIGdldE9yQ3JlYXRlT2JzZXJ2ZXJzTG9va3VwKG9iail7XG4gICAgcmV0dXJuIG9iai5fX29ic2VydmVyc19fIHx8IHRoaXMuY3JlYXRlT2JzZXJ2ZXJzTG9va3VwKG9iaik7XG4gIH1cblxuICBjcmVhdGVPYnNlcnZlcnNMb29rdXAob2JqKSB7XG4gICAgdmFyIHZhbHVlID0ge307XG5cbiAgICB0cnl7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBcIl9fb2JzZXJ2ZXJzX19cIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1jYXRjaChfKXt9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBnZXRPYnNlcnZhdGlvbkFkYXB0ZXIob2JqLCBwcm9wZXJ0eU5hbWUsIGRlc2NyaXB0b3IpIHtcbiAgICB2YXIgaSwgaWksIG9ic2VydmF0aW9uQWRhcHRlcjtcbiAgICBmb3IoaSA9IDAsIGlpID0gdGhpcy5vYnNlcnZhdGlvbkFkYXB0ZXJzLmxlbmd0aDsgaSA8IGlpOyBpKyspe1xuICAgICAgb2JzZXJ2YXRpb25BZGFwdGVyID0gdGhpcy5vYnNlcnZhdGlvbkFkYXB0ZXJzW2ldO1xuICAgICAgaWYgKG9ic2VydmF0aW9uQWRhcHRlci5oYW5kbGVzUHJvcGVydHkob2JqLCBwcm9wZXJ0eU5hbWUsIGRlc2NyaXB0b3IpKVxuICAgICAgICByZXR1cm4gb2JzZXJ2YXRpb25BZGFwdGVyO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIob2JqLCBwcm9wZXJ0eU5hbWUpe1xuICAgIHZhciBvYnNlcnZlckxvb2t1cCwgZGVzY3JpcHRvciwgaGFuZGxlciwgb2JzZXJ2YXRpb25BZGFwdGVyLCB4bGlua1Jlc3VsdDtcblxuICAgIGlmKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQpe1xuICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICByZXR1cm4gbmV3IENsYXNzT2JzZXJ2ZXIob2JqKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT09ICdzdHlsZScgfHwgcHJvcGVydHlOYW1lID09PSAnY3NzJykge1xuICAgICAgICByZXR1cm4gbmV3IFN0eWxlT2JzZXJ2ZXIob2JqLCBwcm9wZXJ0eU5hbWUpO1xuICAgICAgfVxuICAgICAgaGFuZGxlciA9IHRoaXMuZXZlbnRNYW5hZ2VyLmdldEVsZW1lbnRIYW5kbGVyKG9iaiwgcHJvcGVydHlOYW1lKTtcbiAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT09ICd2YWx1ZScgJiYgb2JqLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RWYWx1ZU9ic2VydmVyKG9iaiwgaGFuZGxlciwgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcGVydHlOYW1lID09PSdjaGVja2VkJyAmJiBvYmoudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hlY2tlZE9ic2VydmVyKG9iaiwgaGFuZGxlciwgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gbmV3IFZhbHVlQXR0cmlidXRlT2JzZXJ2ZXIob2JqLCBwcm9wZXJ0eU5hbWUsIGhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgeGxpbmtSZXN1bHQgPSAvXnhsaW5rOiguKykkLy5leGVjKHByb3BlcnR5TmFtZSk7XG4gICAgICBpZiAoeGxpbmtSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBYTGlua0F0dHJpYnV0ZU9ic2VydmVyKG9iaiwgcHJvcGVydHlOYW1lLCB4bGlua1Jlc3VsdFsxXSk7XG4gICAgICB9XG4gICAgICBpZiAoL15cXHcrOnxeZGF0YS18XmFyaWEtLy50ZXN0KHByb3BlcnR5TmFtZSlcbiAgICAgICAgfHwgb2JqIGluc3RhbmNlb2YgU1ZHRWxlbWVudCAmJiBpc1N0YW5kYXJkU3ZnQXR0cmlidXRlKG9iai5ub2RlTmFtZSwgcHJvcGVydHlOYW1lKSkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGFBdHRyaWJ1dGVPYnNlcnZlcihvYmosIHByb3BlcnR5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgaWYgKGhhc0RlY2xhcmVkRGVwZW5kZW5jaWVzKGRlc2NyaXB0b3IpKSB7XG4gICAgICByZXR1cm4gbmV3IENvbXB1dGVkUHJvcGVydHlPYnNlcnZlcihvYmosIHByb3BlcnR5TmFtZSwgZGVzY3JpcHRvciwgdGhpcylcbiAgICB9XG5cbiAgICBsZXQgZXhpc3RpbmdHZXR0ZXJPclNldHRlcjtcbiAgICBpZihkZXNjcmlwdG9yICYmIChleGlzdGluZ0dldHRlck9yU2V0dGVyID0gZGVzY3JpcHRvci5nZXQgfHwgZGVzY3JpcHRvci5zZXQpKXtcbiAgICAgIGlmKGV4aXN0aW5nR2V0dGVyT3JTZXR0ZXIuZ2V0T2JzZXJ2ZXIpe1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdHZXR0ZXJPclNldHRlci5nZXRPYnNlcnZlcihvYmopO1xuICAgICAgfVxuXG4gICAgICAvLyBhdHRlbXB0IHRvIHVzZSBhbiBhZGFwdGVyIGJlZm9yZSByZXNvcnRpbmcgdG8gZGlydHkgY2hlY2tpbmcuXG4gICAgICBvYnNlcnZhdGlvbkFkYXB0ZXIgPSB0aGlzLmdldE9ic2VydmF0aW9uQWRhcHRlcihvYmosIHByb3BlcnR5TmFtZSwgZGVzY3JpcHRvcik7XG4gICAgICBpZiAob2JzZXJ2YXRpb25BZGFwdGVyKVxuICAgICAgICByZXR1cm4gb2JzZXJ2YXRpb25BZGFwdGVyLmdldE9ic2VydmVyKG9iaiwgcHJvcGVydHlOYW1lLCBkZXNjcmlwdG9yKTtcbiAgICAgIHJldHVybiBuZXcgRGlydHlDaGVja1Byb3BlcnR5KHRoaXMuZGlydHlDaGVja2VyLCBvYmosIHByb3BlcnR5TmFtZSk7XG4gICAgfVxuXG4gICAgaWYoaGFzT2JqZWN0T2JzZXJ2ZSl7XG4gICAgICBvYnNlcnZlckxvb2t1cCA9IG9iai5fX29ic2VydmVyX18gfHwgY3JlYXRlT2JzZXJ2ZXJMb29rdXAob2JqLCB0aGlzKTtcbiAgICAgIHJldHVybiBvYnNlcnZlckxvb2t1cC5nZXRPYnNlcnZlcihwcm9wZXJ0eU5hbWUsIGRlc2NyaXB0b3IpO1xuICAgIH1cblxuICAgIGlmKG9iaiBpbnN0YW5jZW9mIEFycmF5KXtcbiAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT09ICdsZW5ndGgnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFycmF5T2JzZXJ2ZXIob2JqKS5nZXRMZW5ndGhPYnNlcnZlcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEaXJ0eUNoZWNrUHJvcGVydHkodGhpcy5kaXJ0eUNoZWNrZXIsIG9iaiwgcHJvcGVydHlOYW1lKTtcbiAgICAgIH1cbiAgICB9ZWxzZSBpZihvYmogaW5zdGFuY2VvZiBNYXApe1xuICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gJ3NpemUnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1hcE9ic2VydmVyKG9iaikuZ2V0TGVuZ3RoT2JzZXJ2ZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgRGlydHlDaGVja1Byb3BlcnR5KHRoaXMuZGlydHlDaGVja2VyLCBvYmosIHByb3BlcnR5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTZXR0ZXJPYnNlcnZlcih0aGlzLnRhc2tRdWV1ZSwgb2JqLCBwcm9wZXJ0eU5hbWUpO1xuICB9XG5cbiAgZ2V0QXJyYXlPYnNlcnZlcihhcnJheSl7XG4gICAgaWYoJ19fYXJyYXlfb2JzZXJ2ZXJfXycgaW4gYXJyYXkpe1xuICAgICAgcmV0dXJuIGFycmF5Ll9fYXJyYXlfb2JzZXJ2ZXJfXztcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXkuX19hcnJheV9vYnNlcnZlcl9fID0gZ2V0QXJyYXlPYnNlcnZlcih0aGlzLnRhc2tRdWV1ZSwgYXJyYXkpO1xuICB9XG5cbiAgZ2V0TWFwT2JzZXJ2ZXIobWFwKXtcbiAgICBpZignX19tYXBfb2JzZXJ2ZXJfXycgaW4gbWFwKXtcbiAgICAgIHJldHVybiBtYXAuX19tYXBfb2JzZXJ2ZXJfXztcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwLl9fbWFwX29ic2VydmVyX18gPSBnZXRNYXBPYnNlcnZlcih0aGlzLnRhc2tRdWV1ZSwgbWFwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT2JqZWN0T2JzZXJ2YXRpb25BZGFwdGVyIHtcbiAgaGFuZGxlc1Byb3BlcnR5KG9iamVjdCwgcHJvcGVydHlOYW1lLCBkZXNjcmlwdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdCaW5kaW5nQWRhcHRlcnMgbXVzdCBpbXBsZW1lbnQgaGFuZGxlc1Byb3BlcnR5KG9iamVjdCwgcHJvcGVydHlOYW1lKS4nKTtcbiAgfVxuXG4gIGdldE9ic2VydmVyKG9iamVjdCwgcHJvcGVydHlOYW1lLCBkZXNjcmlwdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdCaW5kaW5nQWRhcHRlcnMgbXVzdCBpbXBsZW1lbnQgY3JlYXRlT2JzZXJ2ZXIob2JqZWN0LCBwcm9wZXJ0eU5hbWUpLicpO1xuICB9XG59XG4iXX0=